跳到主要内容

Go 的日志包 glog

glog 是一个 C++ 上的 glog 日志框架的 Golang 版本,基本实现了原生 glog 的日志格式。在 Kuberntes 中,glog 是默认日志库。

go get github.com/golang/glog

glog 将日志级别分为 4 种,分别是:

  • INFO:普通日志;
  • WARNING:告警日志;
  • ERROR:错误日志;
  • FATAL:严重错误日志,打印完日志后程序将会推出 os.Exit()

glog 的使用很简单,可参考下面这个例子:

package main

import (
"flag"

"github.com/golang/glog"
)

func main() {
flag.Parse()
defer glog.Flush()

glog.Info("This is info message")
glog.Infof("This is info message: %v", 12345)
glog.InfoDepth(1, "This is info message", 12345)

glog.Warning("This is warning message")
glog.Warningf("This is warning message: %v", 12345)
glog.WarningDepth(1, "This is warning message", 12345)

glog.Error("This is error message")
glog.Errorf("This is error message: %v", 12345)
glog.ErrorDepth(1, "This is error message", 12345)

glog.Fatal("This is fatal message")
glog.Fatalf("This is fatal message: %v", 12345)
glog.FatalDepth(1, "This is fatal message", 12345)
}

当我们运行:

$ mkdir -p log \
&& go run main.go -log_dir=log

以上打印日志将会同时打印在 log/ 目录

20220601164307

这些 flag 参考文档 setting-flags

日志级别功能

glog 最常用的就是 V level 的功能,如下所示:

func main() {
flag.Parse()
defer glog.Flush()

glog.V(3).Info("LEVEL 3 message") // 使用日志级别 3
glog.V(4).Info("LEVEL 4 message") // 使用日志级别 4
glog.V(5).Info("LEVEL 5 message") // 使用日志级别 5
glog.V(8).Info("LEVEL 8 message") // 使用日志级别 8
}

当我们重新运行:

$ go run main.go -log_dir=log -alsologtostderr

将不会看到任何输出,因为日志级别不够

可以通过指定日志级别(-v,log level):

$ go run main.go -v=4 -log_dir=log -alsologtostderr

此时,日志级别小于或等于 4 的日志将被打印出来:

如果我们想对不同的文件实行不同的日志级别,可以用 vmodule 功能,如下代码:

func main() {
flag.Parse()
defer glog.Flush()

bar()
glog.V(3).Info("LEVEL 3 message")
glog.V(4).Info("LEVEL 4 message")
glog.V(5).Info("LEVEL 5 message")
glog.V(8).Info("LEVEL 8 message")
}

其中 bar() 的实现在 bar.go:

func bar() {
glog.V(4).Info("LEVEL 4: level 4 message in bar.go")
}

当我们执行:

$ go run main.go bar.go -v=3 -log_dir=log -alsologtostderr -vmodule=bar=5

-vmodule 的输入参数省去 .go 后缀,且必须以 -vmodule=recordio=2,file=1,gfs*=3 的语法格式

对所有文件的日志级别设定为 3 (-v=3),但是对 bar.go 的日志级别设定为 5,此时会输出:

I0715 13:20:28.381611   30447 bar.go:6] LEVEL 4: level 4 message in bar.go
I0715 13:20:28.383866 30447 main.go:14] LEVEL 3 message

打印堆栈信息

traceLocation 的命令格式为 -log_backtrace_at=gopherflakes.go:234,当运行到指定代码处时,将把该代码的栈信息打印出来,延续上面的代码,我们运行:

$ go run main.go bar.go -v=3 -log_dir=log -alsologtostderr -vmodule=bar=5 -log_backtrace_at=bar.go:6

可见如下输出:

I0715 13:28:17.915837   31920 bar.go:6] LEVEL 4: level 4 message in bar.go
... 打印 backtrace,此处省略 ...
I0715 13:28:17.923715 31920 main.go:14] LEVEL 3 message

References